[HVM][SVM] Add cr8 intercept to/from code for SVM.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Tue, 19 Sep 2006 10:03:36 +0000 (11:03 +0100)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Tue, 19 Sep 2006 10:03:36 +0000 (11:03 +0100)
Add proper vlapic unmapping and freeing in the svm relinquish
resources.

Signed-off-by: Tom Woller <thomas.woller@amd.com>=20
xen/arch/x86/hvm/svm/svm.c

index 1b26ebc13f0710c374e7c0ee1dc87c7b32a2c401..6a06173962e31d52e0903af17c914edc66007f0f 100644 (file)
@@ -56,6 +56,7 @@
 extern void do_nmi(struct cpu_user_regs *, unsigned long);
 extern int inst_copy_from_guest(unsigned char *buf, unsigned long guest_eip,
                                 int inst_len);
+ extern uint32_t vlapic_update_ppr(struct vlapic *vlapic);
 extern asmlinkage void do_IRQ(struct cpu_user_regs *);
 extern void send_pio_req(struct cpu_user_regs *regs, unsigned long port,
                          unsigned long count, int size, long value, int dir, int pvalid);
@@ -896,8 +897,11 @@ static void svm_relinquish_guest_resources(struct domain *d)
         if ( hvm_apic_support(v->domain) && (VLAPIC(v) != NULL) ) 
         {
             kill_timer( &(VLAPIC(v)->vlapic_timer) );
+            unmap_domain_page_global(VLAPIC(v)->regs);
+            free_domheap_page(VLAPIC(v)->regs_page);
             xfree(VLAPIC(v));
         }
+        hvm_release_assist_channel(v);
     }
 
     kill_timer(&d->arch.hvm_domain.pl_time.periodic_tm.timer);
@@ -1599,6 +1603,7 @@ static void mov_from_cr(int cr, int gp, struct cpu_user_regs *regs)
 {
     unsigned long value = 0;
     struct vcpu *v = current;
+    struct vlapic *vlapic = VLAPIC(v);
     struct vmcb_struct *vmcb;
 
     vmcb = v->arch.hvm_svm.vmcb;
@@ -1625,11 +1630,8 @@ static void mov_from_cr(int cr, int gp, struct cpu_user_regs *regs)
             printk( "CR4 read=%lx\n", value );
         break;
     case 8:
-#if 0
-        value = vmcb->m_cr8;
-#else
-        ASSERT(0);
-#endif
+        value = (unsigned long)vlapic_get_reg(vlapic, APIC_TASKPRI);
+        value = (value & 0xF0) >> 4;
         break;
         
     default:
@@ -1656,6 +1658,7 @@ static int mov_to_cr(int gpreg, int cr, struct cpu_user_regs *regs)
     unsigned long value;
     unsigned long old_cr;
     struct vcpu *v = current;
+    struct vlapic *vlapic = VLAPIC(v);
     struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
 
     ASSERT(vmcb);
@@ -1802,6 +1805,13 @@ static int mov_to_cr(int gpreg, int cr, struct cpu_user_regs *regs)
         break;
     }
 
+    case 8:
+    {
+        vlapic_set_reg(vlapic, APIC_TASKPRI, ((value & 0x0F) << 4));
+        vlapic_update_ppr(vlapic);
+        break;
+    }
+
     default:
         printk("invalid cr: %d\n", cr);
         __hvm_bug(regs);